#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

using namespace std;

int cnt = 0;

void handler(int signo)
{
    cout << "我是一个进程，刚刚获取了一个信号: " << signo << endl;
    exit(1);
}

static void Usage(const std::string& proc)
{
    cerr << "Usage:\n\t" << proc << " signo pid" << endl;
}


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        // 子进程
        int *p = nullptr;
        *p = 1000; // 野指针问题
        exit(1);
    }

    // 父进程
    int status = 0;
    waitpid(id, &status, 0);
    printf("exitcode: %d, signo: %d, core dump flag: %d\n", (status >> 8) & 0xFF, status & 0x7F, (status >> 7) & 0x1);

    return 0;
}

// 写一个kill命令，mykill 9 ...
// int main(int argc, char *argv[])
// {
//     // 进程崩溃的本质，是该进程收到了异常信号
//     for(int sig = 1; sig <= 31; sig++)
//     {
//         signal(sig, handler);
//     }

//     // int a[10];
//     // a[10000] = 1000;

//     // int *p = nullptr;
//     // *p = 100;

//     int b = 10;
//     b /= 0;

//     // 统计这个进程1s，cnt++多少次
//     // signal(SIGALRM, handler);
//     // alarm(1);
//     // while(1)
//     // {
//     //     cnt++;
//     //     //printf("hello : %d\n", cnt++);
//     // }


//     // signal(2, handler);// 自定义捕捉动作handler
    
//     // while(1)
//     // {
//     //     sleep(1);
//     //     abort();
//     // }

//     // if(argc != 3)
//     // {
//     //     Usage(argv[0]);
//     //     exit(1);
//     // }

//     // if(kill(static_cast<pid_t>(atoi(argv[2])), atoi(argv[1])) == -1)
//     // {
//     //     cerr << "kill: " << strerror(errno) << endl;
//     //     exit(2);
//     // }
// }



// int main()
// {
//     // 2号信号
//     // 这里不是调用hander方法，这里只是设置了一个会回调，让SIGINT(2)产生的时候，该方法才会被调用
//     // 如果不产生SIGINT，该方法不会被调用
//     // ctrl+c : 本质就是给前台进程发送2号信号给目标进程，目标进程默认对2号信号的处理，是终止自己
//     // 现在更改了对2号信号的处理，设置了用户自定义处理动作
//     signal(SIGINT, handler);
//     signal(3, handler);

//     sleep(3);
//     cout << "进程已经设置完了" << endl;

//     sleep(3);

//     while (true)
//     {
//         cout << "我是一个正在运行中的进程: " << getpid() << endl;
//         sleep(1);
//     }


//     // while(1)
//     // {
//     //     // printf("hello linux\n");
//     //     sleep(1);
//     // }

//     return 0;
// }